# 工厂模式 (Factory Pattern) - 简单示例

# 工厂模式是一种创建型设计模式，它提供了一种创建对象的接口，
# 而无需指定具体要创建的类。

# 1. 简单例子：动物工厂

class Dog:
    """狗类 - 具体产品类"""
    def __init__(self, name):
        """
        初始化狗对象
        :param name: 狗的名字
        """
        self.name = name
    
    def speak(self):
        """
        狗的叫声方法
        :return: 狗的叫声字符串
        """
        return f"{self.name} says Woof!"

class Cat:
    """猫类 - 具体产品类"""
    def __init__(self, name):
        """
        初始化猫对象
        :param name: 猫的名字
        """
        self.name = name
    
    def speak(self):
        """
        猫的叫声方法
        :return: 猫的叫声字符串
        """
        return f"{self.name} says Meow!"

class AnimalFactory:
    """动物工厂类 - 工厂类"""
    
    @staticmethod
    # @staticmethod 装饰器说明：
    # 1. 将方法标记为静态方法
    # 2. 静态方法不需要 self 参数
    # 3. 可以直接通过类名调用，无需创建类实例
    # 4. 不能访问类或实例的属性
    # 5.它是python内置的装饰器
    def create_animal(animal_type, name):
        """
        根据动物类型创建相应的动物对象 - 静态工厂方法
        :param animal_type: 动物类型 ('dog' 或 'cat')
        :param name: 动物名字
        :return: 动物对象 (Dog 或 Cat)
        :raises ValueError: 当不支持的动物类型传入时抛出异常
        """
        if animal_type == "dog":
            return Dog(name)
        elif animal_type == "cat":
            return Cat(name)
        else:
            raise ValueError(f"不支持的动物类型: {animal_type}")

# 使用工厂模式
print("=== 工厂模式示例 ===")
# 通过工厂创建狗对象，无需直接实例化Dog类
dog = AnimalFactory.create_animal("dog", "小白")
# 通过工厂创建猫对象，无需直接实例化Cat类
cat = AnimalFactory.create_animal("cat", "小花")

print(dog.speak())  # 输出: 小白 says Woof!
print(cat.speak())  # 输出: 小花 says Meow!

# 工厂模式的优点：
# 1. 隐藏对象创建的复杂性
# 2. 客户端只需要知道参数，不需要知道具体类名
# 3. 易于扩展，添加新动物类型时不需要修改客户端代码